﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//int main()
//{
//	int a = 10;
//	//&a 取出a的地址
//	printf("%p\n", &a);
//	return 0;
//}

//int main()
//{
//    int n = 10;
//    char* pc = (char*)&n;
//    int* pi = &n;
//    printf("%p\n", &n);
//    printf("%p\n", pc);
//    printf("%p\n", pc + 1);
//    printf("%p\n", pi);
//    printf("%p\n", pi + 1);
//    return 0;
//}

//int main()
//{
//	int a = 10;
//	int* pa = &a;
//	char* pc = &a;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10;
//	void* pa = &a;
//	void* pc = &a;
//	*pa = 10;
//	*pc = 0;
//	return 0;
//}

//int main()
//{
//    const int n = 0;  //定义常变量n
//    printf("n = %d\n", n);
//    int* p = &n;
//    *p = 20;
//    printf("n = %d\n", n);
//    return 0;
//}

//void test1()
//{
//    int n = 10;
//    int m = 20;
//    int* p = &n;
//    *p = 20; //ok
//    p = &m;  //ok
//}
////代码2
//void test2()
//{
//    int n = 10;
//    int m = 20;
//    const int* p = &n;
//    //*p = 20; //err const在*号左边,修饰的是指针指向的值
//    p = &m;    //ok
//}
//void test3()
//{
//    int n = 10;
//    int m = 20;
//    int* const p = &n;
//    *p = 20; //ok
//    //p = &m; //err const在*号右边,修饰的是指针变量
//}
//void test4()
//{
//    int n = 10;
//    int m = 20;
//    int const* const p = &n;
//    //*p = 20; //err
//    //p = &m; //err
//}
//int main()
//{
//    //测试⽆const修饰的情况
//    test1();
//    //测试const放在*的左边情况
//    test2();
//    //测试const放在*的右边情况
//    test3();
//    //测试*的左右两边都有const
//    test4();
//    return 0;
//}

//指针+- 整数
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
//	}
//	return 0;
//}


//int main()
//{
//	int arr[10] = { 1,2,3,4,5,67,7,8,9,10 };
//	int* p = &arr[0];
//	for (int i = 0; i < 10; i++)
//	{
//		*(p++) = i;
//	}
//	//此时p已经越界了，可以把p置为NULL
//	p = NULL;
//	//下次使⽤的时候，判断p不为NULL的时候再使⽤
//	//...
//	p = &arr[0];//重新让p获得地址
//	if (p != NULL) //判断
//	{
//		printf("OK\n");
//	}
//	return 0;
//}

//递归调用的方法
int my_strlen1(char* s)
{
	if (*s == '\0')
		return 0;
	return 1 + my_strlen1(s + 1);
}

//循环遍历
int my_strlen2(char* s)
{
	int count = 0;
	while (*s++)
		count++;
	return count;
}

//指针相减法
int my_strlen3(char* s)
{
	char* tail = s;
	while (*tail)
		++tail;
	return tail - s;
}

int main()
{
	char str[] = "strlentest";
	printf("递归调用:%d\n", my_strlen1(str));
	printf("循环遍历:%d\n", my_strlen2(str));
	printf("指针相减:%d\n", my_strlen3(str));

	char str1[] = "";
	printf("递归调用:%d\n", my_strlen1(str1));
	printf("循环遍历:%d\n", my_strlen2(str1));
	printf("指针相减:%d\n", my_strlen3(str1));

	char str2[] = "1";
	printf("递归调用:%d\n", my_strlen1(str2));
	printf("循环遍历:%d\n", my_strlen2(str2));
	printf("指针相减:%d\n", my_strlen3(str2));
	return 0;
}